diff --git a/src/main.cpp b/src/main.cpp
index 0d66048..0d75c51 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -241,6 +241,12 @@ int main(int argc, char **argv)
     GtkApplication *app;
     int status;
     WCM *wcm;
+    const char *lang = getenv("LANG");
+
+    if (lang && !strcmp(lang, "C"))
+    {
+        lang = NULL;
+    }
 
     wcm = new WCM();
 
@@ -249,19 +255,24 @@ int main(int argc, char **argv)
         return -1;
     }
 
-    if (parse_xml_files(wcm, &wcm->wf_config_mgr))
+    if (parse_xml_files(wcm, &wcm->wf_config_mgr, lang))
     {
         return -1;
     }
 
 #if HAVE_WFSHELL
-    if (parse_xml_files(wcm, &wcm->wf_shell_config_mgr))
+    if (parse_xml_files(wcm, &wcm->wf_shell_config_mgr, lang))
     {
         return -1;
     }
 
 #endif
 
+    if (lang)
+    {
+        printf("Loaded language support: %s\n", lang);
+    }
+
     init(wcm);
 
     app = gtk_application_new("org.gtk.wayfire-config-manager",
diff --git a/src/metadata.cpp b/src/metadata.cpp
index d55ea08..8727777 100644
--- a/src/metadata.cpp
+++ b/src/metadata.cpp
@@ -28,7 +28,7 @@
 #include <wayfire/config/xml.hpp>
 #include "wcm.hpp"
 
-static Option *create_option(xmlNode *cur_node, Plugin *p)
+static Option *create_option(xmlNode *cur_node, Plugin *p, const char *lang)
 {
     Option *o = new Option();
     xmlNode *node;
@@ -115,7 +115,14 @@ static Option *create_option(xmlNode *cur_node, Plugin *p)
 
         if (std::string((char*)node->name) == "_short")
         {
-            o->disp_name = strdup((char*)node->children->content);
+            if (!xmlNodeGetLang(node))
+            {
+                o->disp_name = strdup((char*)node->children->content);
+            } else if (lang && !strcmp(lang, (char*)xmlNodeGetLang(node)))
+            {
+                free(o->disp_name);
+                o->disp_name = strdup((char*)node->children->content);
+            }
         } else if (std::string((char*)node->name) == "_long")
         {
             o->tooltip = strdup((char*)node->children->content);
@@ -307,7 +314,8 @@ static Option *create_option(xmlNode *cur_node, Plugin *p)
 
 static Plugin *get_plugin_data(Plugin *plugin, Option *opt, Option *main_group,
     xmlDoc *doc,
-    xmlNode *a_node)
+    xmlNode *a_node,
+    const char *lang)
 {
     Option *o = opt;
     xmlNode *cur_node = nullptr;
@@ -340,7 +348,14 @@ static Plugin *get_plugin_data(Plugin *plugin, Option *opt, Option *main_group,
             free(prop);
         } else if (std::string((char*)cur_node->name) == "_short")
         {
-            p->disp_name = strdup((char*)cur_node->children->content);
+            if (!xmlNodeGetLang(cur_node))
+            {
+                p->disp_name = strdup((char*)cur_node->children->content);
+            } else if (lang && !strcmp(lang, (char*)xmlNodeGetLang(cur_node)))
+            {
+                free(p->disp_name);
+                p->disp_name = strdup((char*)cur_node->children->content);
+            }
         } else if (std::string((char*)cur_node->name) == "_long")
         {
             p->tooltip = strdup((char*)cur_node->children->content);
@@ -364,7 +379,7 @@ static Plugin *get_plugin_data(Plugin *plugin, Option *opt, Option *main_group,
                 p->options.push_back(main_group);
             }
 
-            o = create_option(cur_node, p);
+            o = create_option(cur_node, p, lang);
             children_handled = true;
             main_group->options.push_back(o);
         } else if (std::string((char*)cur_node->name) == "group")
@@ -385,7 +400,7 @@ static Plugin *get_plugin_data(Plugin *plugin, Option *opt, Option *main_group,
                     group->name = strdup((char*)node->children->content);
                 } else if (std::string((char*)node->name) == "option")
                 {
-                    o = create_option(node, p);
+                    o = create_option(node, p, lang);
                     group->options.push_back(o);
                 } else if (std::string((char*)node->name) == "subgroup")
                 {
@@ -404,7 +419,7 @@ static Plugin *get_plugin_data(Plugin *plugin, Option *opt, Option *main_group,
                             subgroup->name = strdup((char*)n->children->content);
                         } else if (std::string((char*)n->name) == "option")
                         {
-                            o = create_option(n, p);
+                            o = create_option(n, p, lang);
                             subgroup->options.push_back(o);
                         }
                     }
@@ -419,14 +434,14 @@ static Plugin *get_plugin_data(Plugin *plugin, Option *opt, Option *main_group,
 
         if (!children_handled)
         {
-            p = get_plugin_data(p, o, main_group, doc, cur_node->children);
+            p = get_plugin_data(p, o, main_group, doc, cur_node->children, lang);
         }
     }
 
     return p;
 }
 
-int parse_xml_files(WCM *wcm, wf::config::config_manager_t *config_manager)
+int parse_xml_files(WCM *wcm, wf::config::config_manager_t *config_manager, const char *lang)
 {
     for (auto& s : config_manager->get_all_sections())
     {
@@ -447,7 +462,7 @@ int parse_xml_files(WCM *wcm, wf::config::config_manager_t *config_manager)
             printf("Loading %s plugin: %s\n", root_element->name,
                 s->get_name().c_str());
             Plugin *p =
-                get_plugin_data(nullptr, nullptr, nullptr, doc, root_element);
+                get_plugin_data(nullptr, nullptr, nullptr, doc, root_element, lang);
             if (p)
             {
                 p->wcm = wcm;
diff --git a/src/wcm.hpp b/src/wcm.hpp
index 76a780c..8117f48 100644
--- a/src/wcm.hpp
+++ b/src/wcm.hpp
@@ -168,7 +168,7 @@ class WCM
 
 int load_config_files(WCM *wcm);
 
-int parse_xml_files(WCM *wcm, wf::config::config_manager_t *config_manager);
+int parse_xml_files(WCM *wcm, wf::config::config_manager_t *config_manager, const char *lang);
 
 GtkWidget *create_main_layout(WCM *wcm);
 
